/**
 * @file
 * Dieses Modul definiert Knoten von Bin�rb�umen und stellt Funktionen
 * darauf zur Verf�gung.
 *
 * @author  Ulrike Griefahn
 * @date    2010-09-02
 */

#ifndef _BTREENODE_H
#define _BTREENODE_H
/* ------------------------------------------------------------------------ */


/* ===========================================================================
 * Header-Dateien
 * ======================================================================== */

#include "btree_types.h"
#include "BOOL.h"

/* ===========================================================================
 * Funktionsprototypen
 * ======================================================================== */

/**
 * Erzeugt einen neuen Knoten mit den �bergebenen Daten. Der neue Knoten hat 
 * keine Nachfolger.
 *
 * @param data      Daten des neuen Knotens
 * @return          Der neu erzeugte Knoten
 */
extern BTREE_NODE *btreenode_new(char data);

/**
 * Erzeugt eine Kopie (deep copy) des Knotens und seiner direkten und 
 * indirekten Nachfolger. Die Daten in den Knoten werden nicht kopiert, 
 * sondern nur ihre Referenz in die neuen Knoten �bernommen.
 * 
 * @param node  Knoten, ab dem der Bin�rbaum kopiert werden soll
 * @return      Die neu erzeugte Kopie des �bergebenen Knotens
 */
extern BTREE_NODE *btreenode_clone(BTREE_NODE *node);

/**
 * Liefert TRUE, wenn die beiden �bergebenen Knoten dieselben Daten beinhalten
 * und ihre Nachfolgerknoten ebenfalls gleich sind.
 * 
 * @param node1     der erste zu vergleichende Knoten
 * @param node2     der zweite zu vergleichende Knoten
 * @return          TRUE, wenn die beiden Knoten gleich sind, FALSE sonst
 */
extern BOOL btreenode_equals(BTREE_NODE *node1, BTREE_NODE *node2);

/**
 * Liefert die Daten des Knotens.
 * 
 * @param node      Knoten, dessen Daten geliefert werden sollen
 * @return          Daten des Knoten oder NULL, wenn der Knoten keine Daten hat
 *                  oder kein Knoten �bergeben wurde.
 */
extern char btreenode_get_data(BTREE_NODE *node);

/**
 * Liefert den linken Nachfolger des Knotens.
 * 
 * @param node      Knoten, dessen linker Nachfolger geliefert werden soll
 * @return          linker Nachfolger des Knotens oder NULL, wenn der Knoten
 *                  keinen linken Nachfolger hat oder kein Knoten �bergeben
 *                  wurde
 */
extern BTREE_NODE *btreenode_get_left(BTREE_NODE *node);

/**
 * Liefert den rechten Nachfolger des Knotens.
 * 
 * @param node      Knoten, dessen rechter Nachfolger geliefert werden soll
 * @return          rechter Nachfolger des Knotens oder NULL, wenn der Knoten
 *                  keinen rechten Nachfolger hat oder kein Knoten 
 *                  �bergeben wurde
 */
extern BTREE_NODE *btreenode_get_right(BTREE_NODE *node);

/**
 * Pr�ft, ob der �bergebene Knoten ein Blatt ist.
 *
 * @param node      Knoten, der gepr�ft werden soll
 * @return          Liefert TRUE, wenn der Knoten ein Blatt ist, FALSE sonst
 */
extern BOOL btreenode_is_leaf(BTREE_NODE *node);

/**
 * F�gt einen Knoten als linken Nachfolger an einen Elternknoten an, falls 
 * dieser Knoten noch keinen linken Nachfolger hat.
 *
 * @param parent_node   der Elternknoten
 * @param node          der neue Nachfolgerknoten
 * @return              TRUE, wenn der Nachfolger gesetzt werden konnte,
 *                      FALSE, wenn es schon einen Nachfolger gibt
 */
extern BOOL btreenode_set_left(BTREE_NODE *parent_node, BTREE_NODE *node);

/**
 * F�gt einen Knoten als rechten Nachfolger an einen anderen an, falls der 
 * Knoten noch keinen rechten Nachfolger hat.
 *
 * @param parent_node   der Elternknoten
 * @param node          der neue Nachfolgerknoten
 * @return              TRUE, wenn der Nachfolger gesetzt werden konnte,
 *                      FALSE, wenn es schon einen Nachfolger gibt
 */
extern BOOL btreenode_set_right(BTREE_NODE *parent_node, BTREE_NODE *node);

/**
 * Changes the data value of given node to given data.
 */
extern void btreenode_set_data(BTREE_NODE *node, char data);

/**
 * Gibt den Knotens am Bildschirm aus, d.h. die Adresse und die Daten des
 * Knotens. Im zweiten Argument kann eine Funktion zum Ausgeben der im Knoten
 * enthaltenen Daten �bergeben werden. Wird NULL �bergeben, werden die Daten
 * des Knotens nicht ausgegeben.
 *
 * @param node          der auszugebende Knoten
 * @param print_data    Funktion zur Ausgabe der entahltenen Daten
 */
extern void btreenode_print(BTREE_NODE *node, PRINT_FCT print_data);


/* ------------------------------------------------------------------------ */
#endif
